/* (C) Copyright 2024, ZWSOFT Co., LTD.(Guangzhou) All Rights Reserved. */
/** @file Parser.hpp
 *  @brief 解析器与评估器
 *  @details 解析，读取源码文件，运行优化后的代码
 */
#pragma once
#include <unordered_map>
#include "Function.hpp"


 /**
  * @brief 读取代码，并预处理
  * @details 读取源码文件，处理空格（删除多余的，补充缺少的），保存到m_data中
  * @return true:代码正常执行，false:文件读取失败
  */
class Parser {
public:
    Parser(std::string cpp_name, std::string txt_name) : m_cppName(cpp_name), m_txtName(txt_name) {};
    bool parse();
    bool evaluate();
    void reset() { m_results.clear(); };

    std::vector<std::string> get_code() const {return m_code;}
    std::vector<std::vector<std::string>> get_params() const {return m_params;}
    std::vector<std::string> get_given_results() const {return m_givenResults;}
    std::vector<std::string> get_results() const {return m_results;}

private:
    bool read_code();
    bool read_params();
    bool set_function_map();
    void set_functions_ptr();

    
    std::string m_cppName;
    std::string m_txtName;
    std::vector<std::string> m_code;			            //规范后的代码（去除多余空格，补充缺失空格）
    std::vector<std::vector<std::string>> m_params;		    //参数列表以及给定的参考结果
    std::vector<std::string> m_givenResults;                //给定的参考结果

    std::unordered_map<std::string, Function> m_funcMap;	// 函数列表
    std::unordered_set<std::string> m_funcNameSet;	        // 函数名列表
    Function* m_mainFunc = nullptr;						    // 主函数名

    std::vector<std::string> m_results;
};
